package com.example.design.uploadfile;

import com.example.design.uploadfile.bean.ReturnResult;
import com.example.design.uploadfile.bean.SegmentFileDO;
import com.example.design.uploadfile.bean.UpLoadSegmentFileAO;
import com.example.design.uploadfile.service.SegmentFileService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

// 主要实现check文件存在与否
// 上传分片
// 整合分片
@Slf4j
@RestController
public class SegmentFileController {
    @Autowired
    SegmentFileService segmentFileService;

    @Autowired
    private ObjectMapper mapper;

    @Value("${file.save-path}")
    private String savePath;

    @RequestMapping("/index")
    public String index() {
        return "/index.html";
    }

    @RequestMapping("/upload")
    public String upload() {
        return "/pages/upload.html";
    }

    /**
     * 主要方法流程
     * 上传文件需要从前端取分片序号和分片大小，因为切割是前端切滴，所以文件原始大小也要返回来
     * 剩余信息在service中计算
     * 首先确认是否存在该文件，不存在就放到数据库中新建
     * 之后对segmentIndex分别处理，存储分片文件（文件分片前端完成）
     * 简化情况，认为前端都是异步请求，并且分片是按顺序请求的，只有前面的index处理了才能处理后面的分片（在前端体现）
     * 这样当segmentIndex和总count相同时，获取结果
     */
    @RequestMapping("/uploadSegment")
    @ResponseBody
    public ReturnResult upLoadSegmentFile(UpLoadSegmentFileAO upLoadSegmentFileAO) throws JsonProcessingException {
        SegmentFileDO segmentFileDO = segmentFileService.saveSegment(savePath, upLoadSegmentFileAO);
        return new ReturnResult(true, mapper.writeValueAsString(segmentFileDO));
    }

    /**
     * 检查文件是否已经存在
     * 返回null,文件不存在
     * 存在返回文件地址且分片已传完 -> 秒传
     * 如果只传了部分分片，前端调用这个接口，能够知道其实才传了部分分片，前端会继续调用上传方法继续上传 -> 断点续传
     *
     * @param key
     * @return
     * @throws JsonProcessingException
     */
    @RequestMapping("/checkFile")
    @ResponseBody
    public ReturnResult checkFileExist(String key) throws JsonProcessingException {
        SegmentFileDO segmentFile = segmentFileService.getSegmentFileByKey(key);
        if (segmentFile == null)
            return new ReturnResult(false, "该文件未上传");
        else {
            // 转成json回去用
            String fileJson = mapper.writeValueAsString(segmentFile);
            return new ReturnResult(true, fileJson);
        }
    }
}
